VisualHMI - 定时器

VisualHMI的Lua脚本支持32个定时器(软件定时器),索引从0~31。当开启的定时器,超时溢出后,触发定时器回调,在回调函数里面执行相应操作。

本章节,演示定时器倒计时显示,并在定时完成后,下发指令给PLC设备;

适用范围:VisualHMI - HMI&M系列

例程下载链接:ViusalHMI - 定时器(点击下载)

1.API 说明

1.start_timer(timer_id, timeout, countdown, repeat)

启动定时器, 超时后系统自动调用 on_timer(...)

  • timer_id:定时器 ID, 0~31
  • timeout:超时时间, 单位毫秒
  • countdown:0 顺计时, 1 倒计时
  • repeat:重复次数, 0 表示无限重复
2.stop_timer(timer_id)

停止定时器

  • timer_id:定时器ID,0~31,和start_timer搭配使用
3.on_timer(timer_id)

定时器超时回调函数

  • timer_id:定时器ID,0~31

[!note|tip:注意] on_timer()是系统函数,使用时候,主动触发

2. 画面配置

2.1.定时器开关

添加一个位状态指示灯,关联LW1002寄存器,用于控制定时器的开启、关闭;

  1. 读取地址:LW1002
    • 开关类型:切换开关
  2. 切换开关:√
  3. 使用图库:√
  4. 使用文字:√

image-20240117161938430

添加两个滚轮控件,分别关联LW1000、LW1001寄存器,用于定时的时间设置,以“时”控件为例;

  1. 监视地址:LW1000
  2. 总项数:24
  3. 候选项:3
  4. 惯性:√
  5. 候选内容:0;1;2;3;4;5;6;7;8;9;10;...21;22;23;
  6. 控件权限:LW1002

image-20240117162630772

添加一个文本控件关联LW1010寄存器,用于显示倒计时

  • 读取地址:LW1010

image-20240117163116972

3. Lua 脚本

点击位状态指示灯,当值等于1时候,触发定时器开启;值为0时候,关闭定时器。同时,获取倒计时的时间,并复位相关变量和控件值,代码如下所示

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1002
        then
            local val = get_uint16(vtype,addr)
            local hour = get_uint16(vtype,0x1000)
            local minu = get_uint16(vtype,0x1001)
            _TIMER_REPEAT_ = hour*60*60 + minu*60  --计算倒计时,单位s

            set_notify(0) --设置倒计时,不发出指令通知
            set_string(VT_LW, 0x1010, string.format('%02d', (_TIMER_REPEAT_ // (60*60))) ..':'..
                string.format('%02d', ((_TIMER_REPEAT_ // (60)) % 60)) ..':'.. string.format('%02d', (_TIMER_REPEAT_ % 60)))
            if val == 1
            then
                if _TIMER_REPEAT_ > 0 --倒计时大于1才执行
                then
                    _TIMER_CNT_ = 0
                    stop_timer(0)
                    start_timer(0, 1000, 0, _TIMER_REPEAT_)
                end
            else
                stop_timer(0)
            end
        end
    end
end

定时器每秒回调触发on_timer(...),一共触发TIMER_REPEAT次,累计回调的次数TIMER_CNT,并计算出剩余的次数;当TIMER_CNT和TIMER_REPEAT相等时,表示定时结束,发送指令到PLC设备,代码如下所示

function on_timer(timer_id)
    if timer_id == 0
    then
        _TIMER_CNT_ = _TIMER_CNT_ + 1--累计回调次数
        local remaining = _TIMER_REPEAT_ - _TIMER_CNT_ --剩余次数

        set_notify(0)
        set_string(VT_LW, 0x1010, string.format('%02d', (remaining // (60*60))) ..':'.. 
            string.format('%02d', ((remaining // (60)) % 60)) ..':'.. string.format('%02d', (remaining % 60))) --显示倒计时
        if _TIMER_CNT_ == _TIMER_REPEAT_
        then

            set_uint16(VT_LW, 0x1002, 0x00)--复位定时器按钮
            set_notify(1)
            set_uint16(VT_LW, 0x1003, 0x01)--发指令通知主板
        end
    end
end

4. 运行预览

运行虚拟屏,设置定时器60秒,显示倒计时,定时结束后,发送指令给PLC,如下所示

Video_2024-01-17_170730

Copyright ©Dacai all right reserved,powered by Gitbook该文件修订时间: 2024-01-17 17:23:24

results matching ""

    No results matching ""